package com.javaxiaobear.module.system.mapper;

import static com.javaxiaobear.module.system.domain.table.SysNoticeTableDef.SYS_NOTICE;

import com.javaxiaobear.base.common.utils.PageUtils;
import com.javaxiaobear.module.system.domain.SysNotice;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import java.util.Arrays;
import java.util.List;

/**
 * 通知公告表 数据层
 *
 * @author javaxiaobear
 */
public interface SysNoticeMapper extends BaseMapper<SysNotice> {
  /** 查询公告信息 */
  default SysNotice selectNoticeById(Long noticeId) {
    return QueryChain.of(this).where(SYS_NOTICE.NOTICE_ID.eq(noticeId)).one();
  }

  /** 查询公告列表 */
  default List<SysNotice> selectNoticeList(SysNotice notice) {
    var query =
        QueryChain.of(this)
            .select(
                SYS_NOTICE.NOTICE_ID,
                SYS_NOTICE.NOTICE_TITLE,
                SYS_NOTICE.NOTICE_TYPE,
                SYS_NOTICE.NOTICE_CONTENT,
                SYS_NOTICE.STATUS,
                SYS_NOTICE.CREATE_BY,
                SYS_NOTICE.CREATE_TIME,
                SYS_NOTICE.UPDATE_BY,
                SYS_NOTICE.UPDATE_TIME,
                SYS_NOTICE.REMARK)
            .where(SYS_NOTICE.NOTICE_ID.isNotNull())
            .and(
                SYS_NOTICE
                    .NOTICE_TITLE
                    .like(notice.getNoticeTitle())
                    .when(notice.getNoticeTitle() != null && !notice.getNoticeTitle().isEmpty()))
            .and(
                SYS_NOTICE
                    .NOTICE_TYPE
                    .eq(notice.getNoticeType())
                    .when(notice.getNoticeType() != null && !notice.getNoticeType().isEmpty()))
            .and(
                SYS_NOTICE
                    .CREATE_BY
                    .like(notice.getCreateBy())
                    .when(notice.getCreateBy() != null && !notice.getCreateBy().isEmpty()));

    // 处理排序
    if (notice.getOrderByColumn() != null && !notice.getOrderByColumn().isEmpty()) {
      query.orderBy(notice.getOrderByColumn(), "asc".equals(notice.getIsAsc()));
    }

    return query.list();
  }

  default Page<SysNotice> selectNoticePage(SysNotice notice) {
    var query =
        QueryChain.of(this)
            .select(
                SYS_NOTICE.NOTICE_ID,
                SYS_NOTICE.NOTICE_TITLE,
                SYS_NOTICE.NOTICE_TYPE,
                SYS_NOTICE.NOTICE_CONTENT,
                SYS_NOTICE.STATUS,
                SYS_NOTICE.CREATE_BY,
                SYS_NOTICE.CREATE_TIME,
                SYS_NOTICE.UPDATE_BY,
                SYS_NOTICE.UPDATE_TIME,
                SYS_NOTICE.REMARK)
            .where(SYS_NOTICE.NOTICE_ID.isNotNull())
            .and(
                SYS_NOTICE
                    .NOTICE_TITLE
                    .like(notice.getNoticeTitle())
                    .when(notice.getNoticeTitle() != null && !notice.getNoticeTitle().isEmpty()))
            .and(
                SYS_NOTICE
                    .NOTICE_TYPE
                    .eq(notice.getNoticeType())
                    .when(notice.getNoticeType() != null && !notice.getNoticeType().isEmpty()))
            .and(
                SYS_NOTICE
                    .CREATE_BY
                    .like(notice.getCreateBy())
                    .when(notice.getCreateBy() != null && !notice.getCreateBy().isEmpty()));

    // 处理排序
    if (notice.getOrderByColumn() != null && !notice.getOrderByColumn().isEmpty()) {
      query.orderBy(notice.getOrderByColumn(), "asc".equals(notice.getIsAsc()));
    }

    return query.page(PageUtils.getPage());
  }

  /** 新增公告 */
  default int insertNotice(SysNotice notice) {
    return insert(notice);
  }

  /** 修改公告 */
  default int updateNotice(SysNotice notice) {
    return update(notice);
  }

  /** 删除公告 */
  default int deleteNoticeById(Long noticeId) {
    return deleteById(noticeId);
  }

  /** 批量删除公告信息 */
  default int deleteNoticeByIds(Long[] noticeIds) {
    if (noticeIds == null || noticeIds.length == 0) {
      return 0;
    }
    return deleteBatchByIds(Arrays.asList(noticeIds));
  }
}
